"""
创建缓存实例

问题：
    在创建一个类的对象时，如果之前使用同样参数创建过这个对象， 你想返回它的缓存引用。
解决方案：
    种通常是因为你希望相同参数创建的对象时单例的。
    在很多库中都有实际的例子，比如 logging 模块，使用相同的名称创建的 logger 实例永远只有一个。
"""

import weakref


class CachedUserManager:
    def __init__(self):
        self._cache = weakref.WeakValueDictionary()

    def get_user(self, name):
        if name not in self._cache:
            temp = User._new(name)
            self._cache[name] = temp
        else:
            temp = self._cache[name]
        return temp

    def clear(self):
        self._cache.clear()


class User:
    def __init__(self, *args, **kwargs):
        raise RuntimeError("Can't instantiate directly")

    @classmethod
    def _new(cls, name):
        self = cls.__new__(cls)
        self.name = name
        return self


def use_user():
    user_manager = CachedUserManager()
    user1 = user_manager.get_user("Kevin")
    user2 = user_manager.get_user("葛小伦")
    user3 = user_manager.get_user("Kevin")
    print(user1 is user2)
    print(user1 is user3)
    # 输出结果：
    """
    False
    True
    """


if __name__ == '__main__':
    use_user()
